<?php
use Admin\Controller\CM_TWIPS_RATE;
// +----------------------------------------------------------------------
// | OneThink [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2013 http://www.onethink.cn All rights reserved.
// +----------------------------------------------------------------------
// | Author: 麦当苗儿 <zuojiazi@vip.qq.com> <http://www.zjzit.cn>
// +----------------------------------------------------------------------

/**
 * 后台公共文件
 * 主要定义后台公共函数库
 */

/* 解析列表定义规则 */
function get_list_field($data, $grid, $model) {
	
	// 获取当前字段数据
	foreach ( $grid ['field'] as $field ) {
		$array = explode ( '|', $field );
		$temp = $data [$array [0]];
		// 函数支持
		if (isset ( $array [1] )) {
			$temp = call_user_func ( $array [1], $temp );
		}
		$data2 [$array [0]] = $temp;
	}
	if (! empty ( $grid ['format'] )) {
		$value = preg_replace_callback ( '/\[([a-z_]+)\]/', function ($match) use($data2) {
			return $data2 [$match [1]];
		}, $grid ['format'] );
	} else {
		$value = implode ( ' ', $data2 );
	}
	
	// 链接支持
	if (! empty ( $grid ['href'] )) {
		$links = explode ( ',', $grid ['href'] );
		foreach ( $links as $link ) {
			$array = explode ( '|', $link );
			$href = $array [0];
			if (preg_match ( '/^\[([a-z_]+)\]$/', $href, $matches )) {
				$val [] = $data2 [$matches [1]];
			} else {
				$show = isset ( $array [1] ) ? $array [1] : $value;
				// 替换系统特殊字符串
				$href = str_replace ( array (
						'[DELETE]',
						'[EDIT]',
						'[MODEL]' 
				), array (
						'del?id=[id]&model=[MODEL]',
						'edit?id=[id]&model=[MODEL]',
						$model ['id'] 
				), $href );
				
				// 替换数据变量
				$href = preg_replace_callback ( '/\[([a-z_]+)\]/', function ($match) use($data) {
					return $data [$match [1]];
				}, $href );
				
				$val [] = '<a href="' . U ( $href ) . '">' . $show . '</a>';
			}
		}
		$value = implode ( ' ', $val );
	}
	return $value;
}

// 获取模型名称
function get_model_by_id($id) {
	return $model = M ( 'Model' )->getFieldById ( $id, 'title' );
}

// 获取属性类型信息
function get_attribute_type($type = '') {
	// TODO 可以加入系统配置
	static $_type = array (
			'num' => array (
					'数字',
					'int(10) UNSIGNED NOT NULL' 
			),
			'string' => array (
					'字符串',
					'varchar(255) NOT NULL' 
			),
			'textarea' => array (
					'文本框',
					'text NOT NULL' 
			),
			'datetime' => array (
					'时间',
					'int(10) NOT NULL' 
			),
			'bool' => array (
					'布尔',
					'tinyint(2) NOT NULL' 
			),
			'select' => array (
					'枚举',
					'char(50) NOT NULL' 
			),
			'radio' => array (
					'单选',
					'char(10) NOT NULL' 
			),
			'checkbox' => array (
					'多选',
					'varchar(100) NOT NULL' 
			),
			'editor' => array (
					'编辑器',
					'text NOT NULL' 
			),
			'picture' => array (
					'上传图片',
					'int(10) UNSIGNED NOT NULL' 
			),
			'file' => array (
					'上传附件',
					'int(10) UNSIGNED NOT NULL' 
			) 
	);
	return $type ? $_type [$type] [0] : $_type;
}

/**
 * 获取对应状态的文字信息
 *
 * @param int $status        	
 * @return string 状态文字 ，false 未获取到
 * @author huajie <banhuajie@163.com>
 */
function get_status_title($status = null) {
	if (! isset ( $status )) {
		return false;
	}
	switch ($status) {
		case - 1 :
			return '已删除';
			break;
		case 0 :
			return '禁用';
			break;
		case 1 :
			return '正常';
			break;
		case 2 :
			return '待审核';
			break;
		default :
			return false;
			break;
	}
}

// 获取数据的状态操作
function show_status_op($status) {
	switch ($status) {
		case 0 :
			return '启用';
			break;
		case 1 :
			return '禁用';
			break;
		case 2 :
			return '审核';
			break;
		default :
			return false;
			break;
	}
}

/**
 * 获取文档的类型文字
 *
 * @param string $type        	
 * @return string 状态文字 ，false 未获取到
 * @author huajie <banhuajie@163.com>
 */
function get_document_type($type = null) {
	if (! isset ( $type )) {
		return false;
	}
	switch ($type) {
		case 1 :
			return '目录';
			break;
		case 2 :
			return '主题';
			break;
		case 3 :
			return '段落';
			break;
		default :
			return false;
			break;
	}
}

/**
 * 获取配置的类型
 *
 * @param string $type
 *        	配置类型
 * @return string
 */
function get_config_type($type = 0) {
	$list = C ( 'CONFIG_TYPE_LIST' );
	return $list [$type];
}

/**
 * 获取配置的分组
 *
 * @param string $group
 *        	配置分组
 * @return string
 */
function get_config_group($group = 0) {
	$list = C ( 'CONFIG_GROUP_LIST' );
	return $group ? $list [$group] : '';
}

/**
 * select返回的数组进行整数映射转换
 *
 * @param array $map
 *        	映射关系二维数组 array(
 *        	'字段名1'=>array(映射关系数组),
 *        	'字段名2'=>array(映射关系数组),
 *        	......
 *        	)
 * @author 朱亚杰 <zhuyajie@topthink.net>
 * @return array array(
 *         array('id'=>1,'title'=>'标题','status'=>'1','status_text'=>'正常')
 *         ....
 *         )
 *        
 */
function int_to_string(&$data, $map = array('status'=>array(1=>'正常',-1=>'删除',0=>'禁用',2=>'未审核',3=>'草稿'))) {
	if ($data === false || $data === null) {
		return $data;
	}
	$data = ( array ) $data;
	foreach ( $data as $key => $row ) {
		foreach ( $map as $col => $pair ) {
			if (isset ( $row [$col] ) && isset ( $pair [$row [$col]] )) {
				$data [$key] [$col . '_text'] = $pair [$row [$col]];
			}
		}
	}
	return $data;
}

/**
 * 动态扩展左侧菜单,base.html里用到
 *
 * @author 朱亚杰 <zhuyajie@topthink.net>
 */
function extra_menu($extra_menu, &$base_menu) {
	foreach ( $extra_menu as $key => $group ) {
		if (isset ( $base_menu ['child'] [$key] )) {
			$base_menu ['child'] [$key] = array_merge ( $base_menu ['child'] [$key], $group );
		} else {
			$base_menu ['child'] [$key] = $group;
		}
	}
}

/**
 * 获取参数的所有父级分类
 *
 * @param int $cid
 *        	分类id
 * @return array 参数分类和父类的信息集合
 * @author huajie <banhuajie@163.com>
 */
function get_parent_category($cid) {
	if (empty ( $cid )) {
		return false;
	}
	$cates = M ( 'Category' )->where ( array (
			'status' => 1 
	) )->field ( 'id,title,pid' )->order ( 'sort' )->select ();
	$child = get_category ( $cid ); // 获取参数分类的信息
	$pid = $child ['pid'];
	$temp = array ();
	$res [] = $child;
	while ( true ) {
		foreach ( $cates as $key => $cate ) {
			if ($cate ['id'] == $pid) {
				$pid = $cate ['pid'];
				array_unshift ( $res, $cate ); // 将父分类插入到数组第一个元素前
			}
		}
		if ($pid == 0) {
			break;
		}
	}
	return $res;
}

/**
 * 检测验证码
 *
 * @param integer $id
 *        	验证码ID
 * @return boolean 检测结果
 * @author 麦当苗儿 <zuojiazi@vip.qq.com>
 */
function check_verify($code, $id = 1) {
	$verify = new \Think\Verify ();
	return $verify->check ( $code, $id );
}

/**
 * 获取当前分类的文档类型
 *
 * @param int $id        	
 * @return array 文档类型数组
 * @author huajie <banhuajie@163.com>
 */
function get_type_bycate($id = null) {
	if (empty ( $id )) {
		return false;
	}
	$type_list = C ( 'DOCUMENT_MODEL_TYPE' );
	$model_type = M ( 'Category' )->getFieldById ( $id, 'type' );
	$model_type = explode ( ',', $model_type );
	foreach ( $type_list as $key => $value ) {
		if (! in_array ( $key, $model_type )) {
			unset ( $type_list [$key] );
		}
	}
	return $type_list;
}

/**
 * 获取当前文档的分类
 *
 * @param int $id        	
 * @return array 文档类型数组
 * @author huajie <banhuajie@163.com>
 */
function get_cate($cate_id = null) {
	if (empty ( $cate_id )) {
		return false;
	}
	$cate = M ( 'Category' )->where ( 'id=' . $cate_id )->getField ( 'title' );
	return $cate;
}

// 分析枚举类型配置值 格式 a:名称1,b:名称2
function parse_config_attr($string) {
	$array = preg_split ( '/[,;\r\n]+/', trim ( $string, ",;\r\n" ) );
	if (strpos ( $string, ':' )) {
		$value = array ();
		foreach ( $array as $val ) {
			list ( $k, $v ) = explode ( ':', $val );
			$value [$k] = $v;
		}
	} else {
		$value = $array;
	}
	return $value;
}

// 获取子文档数目
function get_subdocument_count($id = 0) {
	return M ( 'Document' )->where ( 'pid=' . $id )->count ();
}

// 分析枚举类型字段值 格式 a:名称1,b:名称2
// 暂时和 parse_config_attr功能相同
// 但请不要互相使用，后期会调整
function parse_field_attr($string) {
	if (0 === strpos ( $string, ':' )) {
		// 采用函数定义
		return eval ( substr ( $string, 1 ) . ';' );
	}
	$array = preg_split ( '/[,;\r\n]+/', trim ( $string, ",;\r\n" ) );
	if (strpos ( $string, ':' )) {
		$value = array ();
		foreach ( $array as $val ) {
			list ( $k, $v ) = explode ( ':', $val );
			$value [$k] = $v;
		}
	} else {
		$value = $array;
	}
	return $value;
}

/**
 * 获取行为数据
 *
 * @param string $id
 *        	行为id
 * @param string $field
 *        	需要获取的字段
 * @author huajie <banhuajie@163.com>
 */
function get_action($id = null, $field = null) {
	if (empty ( $id ) && ! is_numeric ( $id )) {
		return false;
	}
	$list = S ( 'action_list' );
	if (empty ( $list [$id] )) {
		$map = array (
				'status' => array (
						'gt',
						- 1 
				),
				'id' => $id 
		);
		$list [$id] = M ( 'Action' )->where ( $map )->field ( true )->find ();
	}
	return empty ( $field ) ? $list [$id] : $list [$id] [$field];
}

/**
 * 根据条件字段获取数据
 *
 * @param mixed $value
 *        	条件，可用常量或者数组
 * @param string $condition
 *        	条件字段
 * @param string $field
 *        	需要返回的字段，不传则返回整个数据
 * @author huajie <banhuajie@163.com>
 */
function get_document_field($value = null, $condition = 'id', $field = null) {
	if (empty ( $value )) {
		return false;
	}
	
	// 拼接参数
	$map [$condition] = $value;
	$info = M ( 'Model' )->where ( $map );
	if (empty ( $field )) {
		$info = $info->field ( true )->find ();
	} else {
		$info = $info->getField ( $field );
	}
	return $info;
}

/**
 * 获取行为类型
 *
 * @param intger $type
 *        	类型
 * @param bool $all
 *        	是否返回全部类型
 * @author huajie <banhuajie@163.com>
 */
function get_action_type($type, $all = false) {
	$list = array (
			1 => '系统',
			2 => '用户' 
	);
	if ($all) {
		return $list;
	}
	return $list [$type];
}

/**
 * 获取部门名称
 *
 * @param number $key        	
 * @return Ambigous <>
 */
function get_department_name($key = 0) {
	$list = C ( 'APP_DEPARTMENT_LIST' );
	return $list [$key];
}

/**
 * 获取试题类型名称
 *
 * @param number $key        	
 * @return Ambigous <>
 */
function get_questiontype_name($key = 0) {
	$list = C ( 'APP_QUESTIONTYPE_LIST' );
	return $list [$key];
}

/**
 * 获取章节名称
 *
 * @param number $key        	
 * @return Ambigous <>
 */
function get_chapter_name($key = 0) {
	$list = C ( 'APP_CHAPTER_LIST' );
	return $list [$key];
}

/**
 * 获取难度名称
 *
 * @param number $key        	
 * @return Ambigous <>
 */
function get_difficulty_name($key = 0) {
	$list = C ( 'APP_DIFFICULTY_LIST' );
	return $list [$key];
}

/**
 * 调试 函数
 *
 * @param string $content        	
 */
function my_debug($content = '') {
	$content = $content . "  " . time_format ( NOW_TIME ) . "\n";
	file_put_contents ( 'debug.txt', $content, FILE_APPEND );
}

/**
 * 厘米转换缇函数
 *
 * @param number $cm        	
 * @return number
 */
function cmtotwips($cm = 0) {
	return $cm * 567;
}

/**
 * 数值转汉字
 *
 * @author zhiyuan
 */
function del0($num) // 去掉数字段前面的0
{
	return "" . intval ( $num );
}
function n2c($x) // 单个数字变汉字
{
	$arr_n = array (
			"零",
			"一",
			"二",
			"三",
			"四",
			"五",
			"六",
			"七",
			"八",
			"九",
			"十" 
	);
	return $arr_n [$x];
}
function num_r($abcd) // 读取数值（4位）
{
	$arr = array ();
	$str = ""; // 读取后的汉字数值
	$flag = 0; // 该位是否为零
	$flag_end = 1; // 是否以“零”结尾
	$size_r = strlen ( $abcd );
	for($i = 0; $i < $size_r; $i ++) {
		$arr [$i] = $abcd {$i};
	}
	$arrlen = count ( $arr );
	for($j = 0; $j < $arrlen; $j ++) {
		$ch = n2c ( $arr [$arrlen - 1 - $j] ); // 从后向前转汉字
		if ($ch == "零" && $flag == 0) { // 如果是第一个零
			$flag = 1; // 该位为零
			$str = $ch . $str; // 加入汉字数值字符串
			continue;
		} elseif ($ch == "零") { // 如果不是第一个零了
			continue;
		}
		$flag = 0; // 该位不是零
		switch ($j) {
			case 0 :
				$str = $ch;
				$flag_end = 0;
				break; // 第一位（末尾），没有以“零”结尾
			case 1 :
				$str = $ch . "十" . $str;
				break; // 第二位
			case 2 :
				$str = $ch . "百" . $str;
				break; // 第三位
			case 3 :
				$str = $ch . "千" . $str;
				break; // 第四位
		}
	}
	if ($flag_end == 1) 	// 如果以“零”结尾
	{
		mb_internal_encoding ( "UTF-8" );
		$str = mb_substr ( $str, 0, mb_strlen ( $str ) - 1 ); // 把“零”去掉
	}
	return $str;
}
function num2ch($num) // 整体读取转换
{
	$num_real = del0 ( $num ); // 去掉前面的“0”
	$numlen = strlen ( $num_real );
	if ($numlen >= 9) 	// 如果满九位，读取“亿”位
	{
		$y = substr ( $num_real, - 9, 1 );
		$wsbq = substr ( $num_real, - 8, 4 );
		$gsbq = substr ( $num_real, - 4 );
		$a = num_r ( del0 ( $gsbq ) );
		$b = num_r ( del0 ( $wsbq ) ) . "万";
		$c = num_r ( del0 ( $y ) ) . "亿";
	} elseif ($numlen <= 8 && $numlen >= 5) 	// 如果大于等于“万”
	{
		$wsbq = substr ( $num_real, 0, $numlen - 4 );
		$gsbq = substr ( $num_real, - 4 );
		$a = num_r ( del0 ( $gsbq ) );
		$b = num_r ( del0 ( $wsbq ) ) . "万";
		$c = "";
	} elseif ($numlen <= 4) 	// 如果小于等于“千”
	{
		$gsbq = substr ( $num_real, - $numlen );
		$a = num_r ( del0 ( $gsbq ) );
		$b = "";
		$c = "";
		if ($numlen == 2 && $num_real < 20) {
			$a = substr ( $a, 3 ); // 10到19去掉首汉字“一”
		}
		if ($numlen == 1) {
			$a = n2c ( $num_real ); // 一位数处理
		}
	}
	$ch_num = $c . $b . $a;
	return $ch_num;
}

// 加密函数
function my_encrypt($str, $key = 'ItemBank_V1.0') {
	$str = $str . $key;
	$chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-=+";
	$nh = rand ( 0, 64 );
	$ch = $chars [$nh];
	$mdKey = md5 ( $key . $ch );
	$mdKey = substr ( $mdKey, $nh % 8, $nh % 8 + 7 );
	$str = base64_encode ( $str );
	$tmp = '';
	$i = 0;
	$j = 0;
	$k = 0;
	for($i = 0; $i < strlen ( $str ); $i ++) {
		$k = $k == strlen ( $mdKey ) ? 0 : $k;
		$j = ($nh + strpos ( $chars, $str [$i] ) + ord ( $mdKey [$k ++] )) % 64;
		$tmp .= $chars [$j];
	}
	return urlencode ( base64_encode ( $ch . $tmp ) );
}
// 解密函数
function my_decrypt($str, $key = 'ItemBank_V1.0') {
	$str = base64_decode ( urldecode ( $str ) );
	$chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-=+";
	$ch = $str [0];
	$nh = strpos ( $chars, $ch );
	$mdKey = md5 ( $key . $ch );
	$mdKey = substr ( $mdKey, $nh % 8, $nh % 8 + 7 );
	$str = substr ( $str, 1 );
	$tmp = '';
	$i = 0;
	$j = 0;
	$k = 0;
	for($i = 0; $i < strlen ( $str ); $i ++) {
		$k = $k == strlen ( $mdKey ) ? 0 : $k;
		$j = strpos ( $chars, $str [$i] ) - $nh - ord ( $mdKey [$k ++] );
		while ( $j < 0 )
			$j += 64;
		$tmp .= $chars [$j];
	}
	return trim ( base64_decode ( $tmp ), $key );
}
// 由ID获取题库名称
function get_itembank_name($id = 0) {
	$itembank_info = D ( 'ItemBank' )->field ( 'name' )->find ( $id );
	return $itembank_info ['name'];
}
// 由ID获取试卷名称
function get_paper_name($id = 0) {
	$paper_info = D ( 'Papers' )->field ( 'name' )->find ( $id );
	return $paper_info ['name'];
}
// 由月份获取学期名称
function get_semester_name() {
	$year = time_format ( NOW_TIME, 'Y' );
	$month = ( int ) time_format ( NOW_TIME, 'm' );
	if ($month >= 1 && $month <= 6) {
		$semester = $year . '年春季学期';
	} else if ($month >= 9 && $month <= 12) {
		$semester = $year . '年秋季学期';
	} else {
		$semester = $year . '年夏季学期';
	}
	return $semester;
}
// 数值转大写英文字母
function num2letter($num) {
	$letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
	if ($num <= 0) {
		return '';
	} else if ($num > 26) {
		return $num;
	} else {
		return substr($letters, $num-1,1);
	}
}
?>
